type token =
  | INT of (int)
  | PLUS
  | MINUS
  | MUL
  | DIV
  | MATCH
  | WITH
  | PIPE
  | ARROW
  | NEW_LINE
  | LPAREN
  | RPAREN
  | IDENT of (string)
  | FUN
  | FUN_ARROW
  | EOF

open Parsing;;
# 2 "parser1.mly"
 open Ast;;
 let parse_error s = (* Called by the parser function on error *)
 print_endline  s;
 flush stdout
# 26 "parser1.ml"
let yytransl_const = [|
  258 (* PLUS *);
  259 (* MINUS *);
  260 (* MUL *);
  261 (* DIV *);
  262 (* MATCH *);
  263 (* WITH *);
  264 (* PIPE *);
  265 (* ARROW *);
  266 (* NEW_LINE *);
  267 (* LPAREN *);
  268 (* RPAREN *);
  270 (* FUN *);
  271 (* FUN_ARROW *);
    0 (* EOF *);
    0|]

let yytransl_block = [|
  257 (* INT *);
  269 (* IDENT *);
    0|]

let yylhs = "\255\255\
\002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
\002\000\003\000\003\000\004\000\004\000\001\000\000\000"

let yylen = "\002\000\
\001\000\001\000\003\000\003\000\003\000\003\000\003\000\004\000\
\004\000\000\000\005\000\001\000\002\000\002\000\002\000"

let yydefred = "\000\000\
\000\000\000\000\001\000\000\000\000\000\002\000\000\000\015\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\013\000\014\000\000\000\007\000\000\000\000\000\000\000\
\005\000\006\000\000\000\009\000\008\000\000\000\000\000\000\000\
\011\000"

let yydgoto = "\002\000\
\008\000\009\000\028\000\010\000"

let yysindex = "\003\000\
\255\254\000\000\000\000\255\254\255\254\000\000\251\254\000\000\
\038\255\009\000\043\255\018\255\252\254\255\254\255\254\255\254\
\255\254\000\000\000\000\006\255\000\000\255\254\254\254\254\254\
\000\000\000\000\019\255\000\000\000\000\025\255\255\254\023\255\
\000\000"

let yyrindex = "\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\001\000\000\000\000\000\015\000\029\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\038\000\
\000\000"

let yygindex = "\000\000\
\000\000\002\000\004\000\028\000"

let yytablesize = 308
let yytable = "\003\000\
\010\000\016\000\017\000\001\000\004\000\011\000\012\000\013\000\
\019\000\005\000\022\000\006\000\007\000\027\000\003\000\023\000\
\024\000\025\000\026\000\014\000\015\000\016\000\017\000\029\000\
\014\000\015\000\016\000\017\000\004\000\021\000\027\000\030\000\
\032\000\031\000\012\000\033\000\018\000\010\000\003\000\014\000\
\015\000\016\000\017\000\004\000\014\000\015\000\016\000\017\000\
\005\000\020\000\006\000\007\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
\000\000\000\000\000\000\010\000\010\000\010\000\010\000\003\000\
\003\000\003\000\000\000\000\000\003\000\003\000\003\000\000\000\
\000\000\003\000\003\000\003\000\003\000\004\000\004\000\004\000\
\000\000\000\000\004\000\004\000\004\000\000\000\010\000\004\000\
\004\000\004\000\004\000\010\000\010\000\000\000\000\000\000\000\
\010\000\010\000\010\000\010\000"

let yycheck = "\001\001\
\000\000\004\001\005\001\001\000\006\001\004\000\005\000\013\001\
\000\000\011\001\015\001\013\001\014\001\008\001\000\000\014\000\
\015\000\016\000\017\000\002\001\003\001\004\001\005\001\022\000\
\002\001\003\001\004\001\005\001\000\000\012\001\008\001\013\001\
\031\000\009\001\000\000\032\000\009\000\000\000\001\001\002\001\
\003\001\004\001\005\001\006\001\002\001\003\001\004\001\005\001\
\011\001\007\001\013\001\014\001\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\001\001\002\001\003\001\004\001\005\001\006\001\007\001\
\255\255\255\255\255\255\011\001\012\001\013\001\014\001\001\001\
\002\001\003\001\255\255\255\255\006\001\007\001\008\001\255\255\
\255\255\011\001\012\001\013\001\014\001\001\001\002\001\003\001\
\255\255\255\255\006\001\007\001\008\001\255\255\001\001\011\001\
\012\001\013\001\014\001\006\001\007\001\255\255\255\255\255\255\
\011\001\012\001\013\001\014\001"

let yynames_const = "\
  PLUS\000\
  MINUS\000\
  MUL\000\
  DIV\000\
  MATCH\000\
  WITH\000\
  PIPE\000\
  ARROW\000\
  NEW_LINE\000\
  LPAREN\000\
  RPAREN\000\
  FUN\000\
  FUN_ARROW\000\
  EOF\000\
  "

let yynames_block = "\
  INT\000\
  IDENT\000\
  "

let yyact = [|
  (fun _ -> failwith "parser")
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : int) in
    Obj.repr(
# 25 "parser1.mly"
                               ( IntConst(_1))
# 196 "parser1.ml"
               : Ast.exp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in
    Obj.repr(
# 26 "parser1.mly"
                               ( StringConst(_1))
# 203 "parser1.ml"
               : Ast.exp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : Ast.exp) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : Ast.exp) in
    Obj.repr(
# 27 "parser1.mly"
                               ( Binop( Plus, _1, _3))
# 211 "parser1.ml"
               : Ast.exp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : Ast.exp) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : Ast.exp) in
    Obj.repr(
# 28 "parser1.mly"
                               ( Binop( Minus,_1, _3))
# 219 "parser1.ml"
               : Ast.exp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : Ast.exp) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : Ast.exp) in
    Obj.repr(
# 29 "parser1.mly"
                               ( Binop( Mul, _1, _3))
# 227 "parser1.ml"
               : Ast.exp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : Ast.exp) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : Ast.exp) in
    Obj.repr(
# 30 "parser1.mly"
                               ( Binop( Div, _1, _3))
# 235 "parser1.ml"
               : Ast.exp))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 1 : Ast.exp) in
    Obj.repr(
# 31 "parser1.mly"
                               ( _2 )
# 242 "parser1.ml"
               : Ast.exp))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 2 : string) in
    let _4 = (Parsing.peek_val __caml_parser_env 0 : Ast.exp) in
    Obj.repr(
# 32 "parser1.mly"
                               ( Fun( _2,_4))
# 250 "parser1.ml"
               : Ast.exp))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 2 : Ast.exp) in
    let _4 = (Parsing.peek_val __caml_parser_env 0 : 'match_exp) in
    Obj.repr(
# 33 "parser1.mly"
                               ( Match(_2,_4))
# 258 "parser1.ml"
               : Ast.exp))
; (fun __caml_parser_env ->
    Obj.repr(
# 37 "parser1.mly"
           ( [])
# 264 "parser1.ml"
               : 'match_exp))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 3 : string) in
    let _4 = (Parsing.peek_val __caml_parser_env 1 : Ast.exp) in
    let _5 = (Parsing.peek_val __caml_parser_env 0 : 'match_exp) in
    Obj.repr(
# 38 "parser1.mly"
                                  ((_2,_4)::_5)
# 273 "parser1.ml"
               : 'match_exp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : Ast.exp) in
    Obj.repr(
# 43 "parser1.mly"
                               ( _1)
# 280 "parser1.ml"
               : 'appexp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 1 : Ast.exp) in
    let _2 = (Parsing.peek_val __caml_parser_env 0 : 'appexp) in
    Obj.repr(
# 44 "parser1.mly"
                               ( App(_1,_2))
# 288 "parser1.ml"
               : 'appexp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 1 : 'appexp) in
    Obj.repr(
# 47 "parser1.mly"
                               ( _1)
# 295 "parser1.ml"
               : Ast.appexp))
(* Entry main *)
; (fun __caml_parser_env -> raise (Parsing.YYexit (Parsing.peek_val __caml_parser_env 0)))
|]
let yytables =
  { Parsing.actions=yyact;
    Parsing.transl_const=yytransl_const;
    Parsing.transl_block=yytransl_block;
    Parsing.lhs=yylhs;
    Parsing.len=yylen;
    Parsing.defred=yydefred;
    Parsing.dgoto=yydgoto;
    Parsing.sindex=yysindex;
    Parsing.rindex=yyrindex;
    Parsing.gindex=yygindex;
    Parsing.tablesize=yytablesize;
    Parsing.table=yytable;
    Parsing.check=yycheck;
    Parsing.error_function=parse_error;
    Parsing.names_const=yynames_const;
    Parsing.names_block=yynames_block }
let main (lexfun : Lexing.lexbuf -> token) (lexbuf : Lexing.lexbuf) =
   (Parsing.yyparse yytables 1 lexfun lexbuf : Ast.appexp)
;;
